package linked;

//定义链表
public class SingleLinkedList {
    //定义头结点
    private static Node head = new Node();

    //向链表添加数据
    public static void addDate(int value) {
        //初始化要添加的节点
        Node node = new Node(value);
        //设置临时节点
        Node temp = head;
        //找到尾节点
        while (temp.next != null) {
            temp = temp.next;
        }
        //已经包括了头节点为null的情况了
        temp.next = node;

    }

    //获取链表的长度
    public static int linkstLength(Node head) {
        int length = 0;
        //设置临时节点
        Node temp = head.next;
        //找尾节点
        while (temp != null) {
            length++;
            temp = temp.next;
        }
        return length;
    }

    //删除节点
    public static void deleteNode(Node head, int index) {
        //设置临时节点
        //设置临时节点,从头节点开始
        Node temp = head;
        //纪录当前遍历位置
        int currentPos = 0;
        while (temp.next != null) {
            if ((index - 1) == currentPos) {//找到了上个元素
                Node delete = temp.next; //拿到了当前想要删除的元素
                temp.next = delete.next; //把要删除的那个元素的下一个指向当前元素

                delete = null;
                return;
            }
            currentPos++;
            temp = temp.next;
        }

    }

    //插入节点
    public static void insertNode(Node head, int index, int value) {
        //判断指定位置是否合法
        if (index < 1 || index > linkstLength(head) + 1) {
            System.out.println("插入位置不合法");
            return;
        }
        //设置临时节点,从头节点开始
        Node temp = head;
        //纪录当前遍历位置
        int currentPos = 0;
        //初始化插入的节点
        Node insterNode = new Node(value);
        //循环操作
        while (temp.next != null) {
            //找到上一个节点的位置
            if ((index - 1) == currentPos) {
                //temp 就是代表上一个元素 将原本上一个元素的指针指到插入元素
                insterNode.next = temp.next;
                //将上一个节点的指针指向要插入的节点
                temp.next = insterNode;
                return;
            }
            currentPos++;
            temp = temp.next;
        }
    }


    //遍历节点
    public static void traverse(Node head) {
        //定义临时节点
        Node temp = head.next;
        while (temp != null) {
            if (temp.date != null) {
                System.out.println("当前节点" + temp.date);
            }
            temp = temp.next;
        }
    }

    public static void main(String[] args) {
        addDate(11);
        addDate(22);
        addDate(33);
        addDate(44);
        traverse(head);
        System.out.println("--------");
        deleteNode(head,3);
//        insertNode(head, 2, 55);
        traverse(head);
        System.out.println(linkstLength(head));
    }

}
